#include "stack.h"

//欺骗函数，删除栈顶元素并不需要比较操作,所以这里返回0,并且匹配的元素也设为0,让fetch操作开始就能匹配到元素
static int always_match(const void *p, const void *q)
{
     return 0;
}

STACK *stack_create(int initsize)
{
     return list_create(initsize);
}
void stack_destory(STACK **ptr)
{
     list_destory(ptr);
}

int stack_push(STACK *ptr, const void *data)
{
     return list_insert(ptr, data, LIST_FORWARD);   //相当于链表的首部插入操作
}

int stack_pop(STACK *ptr, void *data)
{
     return list_fetch(ptr, (void *)0, always_match, data);   //相当于链表的首部删除
}

int stack_top(STACK *ptr,void *value)
{
     //由于链表未提供获取首部的接口，所以获取栈顶元素只能这样
     int ret = list_fetch(ptr, (void *)0, always_match, value);
     if (ret == -1)              //栈为空
          return -1;
     list_insert(ptr, value, LIST_FORWARD);   
     return 0;
}